home *** CD-ROM | disk | FTP | other *** search
- ditfft macro points,passes,data,twiddle
- ;
- ; Radix 2 Decimation in Time In-Place Fast Fourier Transform Routine
- ;
- ; Complex input and output data
- ; Real data in X memory
- ; Imaginary data in Y memory
- ; Normally ordered input data
- ; Bit reversed output data
- ; Twiddle factors lookup table
- ; Cosine value in X memory
- ; -Sine value in Y memory
- ;
- ; Macro Call - ditfft points,passes,data,twiddle
- ;
- ; points number of points (4-32768, power of 2)
- ; passes number of fft passes (log2 points)
- ; data start of data buffer
- ; twiddle start of sine/cosine table
- ;
- ; Alters Data ALU Registers
- ; x1 x0 y1 y0
- ; a2 a1 a0 a
- ; b2 b1 b0 b
- ;
- ; Alters Address Registers
- ; r0 n0 m0
- ; r1 n1 m1
- ; n2
- ;
- ; r4 n4 m4
- ; r5 n5 m5
- ; r6 n6 m6
- ;
- ; Alters Program Control Registers
- ; pc sr
- ;
- ; Uses 6 locations on System Stack
- ;
- ; Authors - Kevin Kloker and Garth Hillman
- ; Latest Revision - Jan. 20, 1986
- ;
- page
- move #points,n0 ;initialize butterflies per group
- move #1,n2 ;initialize groups per pass
- move #points/4,n6 ;initialize twiddle offset
- move #-1,m0 ;initialize address modifiers
- move m0,m1 ;for linear addressing
- move m0,m4
- move m0,m5
- move #0,m6 ;initialize twiddle factor address modifier
- ;for reverse carry (bit reversed) addressing
- ;
- ; Perform all FFT passes with triple nested DO loop
- ;
- do #passes,_end_pass
- move n0,a1 ;divide butterflies per group by two
- lsr a #data,r0 ;and initialize A input pointer
- move a1,n0 ;update butterflies per group
- move r0,r4 ;initialize A output pointer
- lua (r0)+n0,r1 ;initialize B input pointer
- lua (r1)-,r5 ;initialize B output pointer
- move #twiddle,r6 ;initialize twiddle factor pointer
- move n0,n1 ;initialize pointer offsets
- move n0,n4
- move n0,n5
-
- do n2,_end_grp
- move x:(r1),x1 y:(r6),y0 ;lookup -sine value
- move x:(r5),a y:(r0),b ;dummy load of a
- move x:(r6)+n6,x0 ;lookup cosine value
-
-
- do n0,_end_bfy
- mac x1,y0,b y:(r1)+,y1 ;Radix 2 DIT butterfly kernel
- macr x0,y1,b a,x:(r5)+ y:(r0),a ;with constant twiddle factor
- subl b,a x:(r0),b b,y:(r4)
- mac x1,x0,b x:(r0)+,a a,y:(r5)
- macr -y1,y0,b x:(r1),x1
- subl b,a b,x:(r4)+ y:(r0),b
- _end_bfy
- move a,x:(r5)+n5 y:(r1)+n1,y1 ;dummy load of x1 and y1
- move x:(r0)+n0,x1 y:(r4)+n4,y1
- _end_grp
- move n2,a1
- lsl a ;multiply groups per pass by two
- move a1,n2 ;update groups per pass
- _end_pass
- endm
-